package sv.gob.mtps.sib.controller;
 

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import sv.gob.mtps.sib.model.EstadoPedido;
import sv.gob.mtps.sib.model.Inventario;
import sv.gob.mtps.sib.model.InventarioHasTransacciones;
import sv.gob.mtps.sib.model.PedidoHasProducto;
import sv.gob.mtps.sib.model.Fuentefondo;
import sv.gob.mtps.sib.model.Pedido;
import sv.gob.mtps.sib.model.Transaccion;
import sv.gob.mtps.sib.service.PedidoService;
import sv.gob.mtps.sib.service.ProductoService;
import sv.gob.mtps.sib.utils.SendMail;

@Controller
public class PedidoController {
	

	
	
	
	@Autowired
    private PedidoService pedidoService;
	
	@Autowired
    private ProductoService productoService;
	
	@RequestMapping("/admin/pedidoAgregar")
    public String listPedido(Map<String, Object> map) {		
			map.put("pedido", new Pedido());
			map.put("pedidoList", pedidoService.listPedidosMas());
			map.put("productoList", productoService.listProducto());
        return "/admin/pedidoAgregar";
    }
 
	@RequestMapping(value = "/admin/addPedido", method = RequestMethod.POST)
    public String addPedido(@ModelAttribute("pedido")
    Pedido pedido, BindingResult result) {
		//Unidadmedida unidadMed = (Unidadmedida) producto.getUnidadmedida();
		//pedido.setIdPedido(0);
		pedido.setFechaRegistroPedido(new Date());
		//pedido.setPedidoHasProducto("1");
		
		/*se Inicializa el estado*/
		EstadoPedido st = new EstadoPedido(); 
		st.setIdEstadopedido(1);
		pedido.setEstadoPedido(st);
		pedidoService.addPedido(pedido); 
        return "redirect:/admin/pedidoAgregar";
    }
	
	@RequestMapping(value = "/admin/editPedido", method = RequestMethod.POST)
	public String editPedido(@ModelAttribute("pedido") Pedido pedido, BindingResult result){
		try{			
					
						
			pedidoService.updatePedido(pedido);
		}catch(Exception ex){
			ex.printStackTrace();
		}
			
			return  "redirect:/admin/pedidoAgregar";
	}
	
	
	@RequestMapping(value = "/admin/liquidarPedido", method = RequestMethod.POST)
	public String liquidarPedido(@ModelAttribute("pedido") Pedido pedido, BindingResult result){
		System.out.println("ingresa al metodo");
		try{
			
			EstadoPedido st = new EstadoPedido();
			System.out.println("ingresa al metodo");
			st.setIdEstadopedido(4);
			pedido.setEstadoPedido(st);
			pedidoService.updatePedido(pedido);
		}catch(DataAccessException ex){
			ex.printStackTrace();
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
			
			return  "redirect:/admin/pedidoAgregar";
	}
	
	
	@RequestMapping(value = "/admin/delPedido", method = RequestMethod.POST)
	public String delPedido(@ModelAttribute("pedido") Pedido pedido, BindingResult result){		
		try{
			pedidoService.removePedido(pedido.getIdPedido());
		}
		catch(DataAccessException ex){
			ex.printStackTrace();
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
			
			return  "redirect:/admin/pedidoAgregar";
	}
	
	
	
	@RequestMapping(value = "/admin/findPedidoDet")
	public String findPedido(@ModelAttribute("pedidoDet") Pedido pedido, BindingResult result,Map<String, Object> map){
		map.put("pedido",pedidoService.findPedido(pedido.getIdPedido()));
		
		return "redirect:/admin/showPedido";

		
	}
	
	
	@RequestMapping(value = "/admin/showPedidoDetFind")
	public  String showPedidoDetFind(@ModelAttribute("PedidoDet") PedidoHasProducto pedido,BindingResult result,Map<String, Object> map,HttpServletRequest request){				
		PedidoHasProducto pd = new PedidoHasProducto();
		Pedido p = pedidoService.findPedido(pedido.getPedido().getIdPedido());
		
		System.out.println("Estado Factura " + p.getEstadoPedido().getIdEstadopedido());
		pd.setPedido(p);
		map.put("pedido", pd);		
		map.put("pedidoListDet", pedidoService.listPedidosDet(p.getIdPedido()));
		map.put("productoList", productoService.listProducto());		
		return "admin/PedidoDet";		
	}
	
	@RequestMapping(value = "/admin/showPedidoDet")
	public  String showFactDet(@ModelAttribute("PedidoDet") Pedido pedido,BindingResult result,Map<String, Object> map,HttpServletRequest request,Model model){				
		PedidoHasProducto pd = new PedidoHasProducto();		
		String pedidopar = (String)request.getParameter("pedidoID");
		String messageKey = (String) request.getParameter("messageKey");
		String tipo_msg = (String) request.getParameter("tipo_msg");
		if(pedidopar != null){
			pedido.setIdPedido(Integer.parseInt(pedidopar));
		}
		
		
		System.out.println("id pedido " + pedido.getIdPedido());
		Pedido p = pedidoService.findPedido(pedido.getIdPedido());		
		System.out.println("Estado Factura " + p.getEstadoPedido().getIdEstadopedido());
		pd.setPedido(pedido);
		map.put("pedido", pd);		
		System.out.println("Mensage " + messageKey);
		model.addAttribute("messageKey", messageKey);
		model.addAttribute("tipo_msg",tipo_msg);
		map.put("pedidoListDet", pedidoService.listPedidosDet(pedido.getIdPedido()));
		map.put("productoList", productoService.listProducto());
		map.put("messageKey", messageKey);
		map.put("tipo_msg", tipo_msg);
		
		return "admin/PedidoDet";		
	}


	
	@RequestMapping(value = "/admin/addPedidoDet")
	public  String addFactDet(@ModelAttribute("pedido") PedidoHasProducto pedidoDet,BindingResult result,Map<String, Object> map,HttpServletRequest request){								
		String tipo_msg = null;
		String messageKey = null;
			
	try{		
		if(pedidoService.listPedidoDet(pedidoDet.getPedido().getIdPedido(), pedidoDet.getInventario().getIdInventario()).isEmpty()){
			if(pedidoService.listPedidosDet(pedidoDet.getPedido().getIdPedido()).isEmpty()){				
				EstadoPedido st = new EstadoPedido(); 
				st.setIdEstadopedido(2);
				Pedido pedido = pedidoService.findPedido(pedidoDet.getPedido().getIdPedido());
				pedido.setEstadoPedido(st);
				pedidoService.updatePedido(pedido);
			}
			if(valForm(pedidoDet)){
				pedidoService.addPedidoDet(pedidoDet);
				if(pedidoDet.isAplicaDes()){				
					actualizaInv(pedidoDet);					
					tipo_msg = "1";					
					messageKey = "Se ha realizado el descargo a inventario";
				}
				tipo_msg = "1";				
				messageKey = "Se ha almacenado el registro exitosamente";
			}else{
				tipo_msg = "3";	
				messageKey = "cantidad a descargar excede cantidad solicitada o existencia en Inventario";
			}
											
					
		}
		else{
			messageKey = "esta convinacion de Producto Inventario ya existe";
			tipo_msg = "3";
		}		
	}catch(DataAccessException ex){
		ex.printStackTrace();
		messageKey = "un error a ocurrido,favor contactar al administrador del sistema";
		tipo_msg = "3";
		
	}
	catch(Exception ex){
		messageKey = "un error a ocurrido,favor contactar al administrador del sistema";
		tipo_msg = "3";
		ex.printStackTrace();
	}
		
			
			request.setAttribute("pedido", pedidoDet.getPedido());
		return "redirect:/admin/showPedidoDet?pedidoID="+pedidoDet.getPedido().getIdPedido()+"&tipo_msg="+tipo_msg+"&messageKey="+messageKey;		
	}
	
	@RequestMapping(value = "/admin/delPedidoDet")
	public  String delFactDet(@ModelAttribute("pedido") PedidoHasProducto pedidoDet,BindingResult result,Map<String, Object> map,HttpServletRequest request){								
		String messageKey = null;
		String tipo_msg = null; 
		try{
			pedidoService.removePedidoDet(pedidoDet.getIdPedidoHasProducto());
			messageKey = "Registro Eliminado Exitosamente";
			tipo_msg = "1";
		}
		catch(DataAccessException ex){
			messageKey = "un error a ocurrido,favor contactar al administrador del sistema";
			tipo_msg = "3";
			ex.printStackTrace();			
		}
		catch(Exception ex){
			messageKey = "un error a ocurrido,favor contactar al administrador del sistema";
			tipo_msg = "3";
			ex.printStackTrace();
		}
		
		
		return "redirect:/admin/showPedidoDet?pedidoID="+pedidoDet.getPedido().getIdPedido()+"&tipo_msg="+tipo_msg+"&messageKey="+messageKey;
	}
	
	@RequestMapping(value = "/admin/editPedidoDet")
	public  String editPedidoDet(@ModelAttribute("pedido") PedidoHasProducto pedidoDet,BindingResult result,Map<String, Object> map,HttpServletRequest request){										
		String messageKey= null;
		String tipo_msg = null;
		try{
			System.out.println("id producto det " + pedidoDet.getIdPedidoHasProducto());
			System.out.println("id producto inventario " + pedidoDet.getInventario().getIdInventario());
			if(valForm(pedidoDet)){
				pedidoService.updatePedidoDet(pedidoDet);
				if(pedidoDet.isAplicaDes()){
					System.out.println("id inventario ");
					actualizaInv(pedidoDet);					
					tipo_msg = "1";					
					messageKey = "Se ha realizado el descargo a inventario";
				}
				
			}
			else{
				tipo_msg = "3";	
				messageKey = "cantidad a descargar excede cantidad solicitada o existencia en Inventario";
			}
				
		}
		catch(DataAccessException ex){
			messageKey = "un error a ocurrido,favor contactar al administrador del sistema";
			tipo_msg = "3";
			ex.printStackTrace();
		}
		catch(Exception ex){
			messageKey = "un error a ocurrido,favor contactar al administrador del sistema";
			tipo_msg = "3";
			ex.printStackTrace();
		}
		
		return "redirect:/admin/showPedidoDet?pedidoID="+pedidoDet.getPedido().getIdPedido()+"&tipo_msg="+tipo_msg+"&messageKey="+messageKey;		
	}
	
	
	@RequestMapping(value = "/admin/findInvent")
	public  String findInvent(@ModelAttribute("pedido") Pedido pedido,BindingResult result,Map<String, Object> map){
		map.put("objList", pedidoService.listInvent());
		return "admin/find_inv";		
	}
	
	@RequestMapping(value = "/reporte/reporteInvent")
	public  String reporteInvent(@ModelAttribute("pedido") Pedido pedido,BindingResult result,Map<String, Object> map){
		map.put("objList", pedidoService.listInvent());
		return "user/find_inv";		
	}
	
	@RequestMapping(value = "/admin/findSeccionUni")
	public  String findSeccionUni(@ModelAttribute("pedido") Pedido pedido,BindingResult result,Map<String, Object> map){
		map.put("objList", pedidoService.listSeccionUnidad());
		return "admin/find_seccion";		
	}
	
	public void actualizaInv(PedidoHasProducto dto){	
		System.out.println("id inventario " + dto.getInventario().getIdInventario());
		
		Inventario inv = pedidoService.findInventario(dto.getInventario().getIdInventario()) ;
		int resta = Integer.parseInt( inv.getExistencia().toString())-dto.getCantidadDes();
		inv.setExistencia(resta);
		System.out.println("Existencia " + resta);
			if(resta < 0){
				System.out.println("Cantidad a cargar excede la existencia en Inventario");
			}
			else if(resta == 0){
				try{
					SendMail sd = new SendMail("bodega@mtps.gob.sv","jhenriquez@mtps.gob.sv","prueba","Inventario agotado");
					sd.send();
				}catch(Exception ex){
					ex.printStackTrace();
				}
				
				System.out.println("Inventario esta vacio se envia Correo");
			}
			if(resta >= 0){
				System.out.println("Inventario actualizado exitosamente");
				pedidoService.updateInventario(inv);
			}
			dto.setInventario(inv);
			IngresaTransa(dto);				
	}
	
	public void IngresaTransa(PedidoHasProducto dto){
		InventarioHasTransacciones tr = new InventarioHasTransacciones(); 
		Transaccion tran = new Transaccion();
		tran.setIdTransaccion(2);
		System.out.println("id padre " + dto.getPedido().getIdPedido());
		System.out.println("id Inventario " +  dto.getInventario().getIdInventario());
		List dtos = pedidoService.listPedidoDet(dto.getPedido().getIdPedido(), dto.getInventario().getIdInventario());
		System.out.println("realizo el query ");
		if(!dtos.isEmpty()){
			System.out.println("Tiene datos");
			Iterator it = dtos.iterator();
			while(it.hasNext()){
				PedidoHasProducto dto1 = (PedidoHasProducto)it.next();
				tr.setFechaTransaccion(new Date());
				tr.setIdDocumentoPadre(dto.getPedido().getIdPedido());
				tr.setInventario(dto1.getInventario());
				tr.setNumeroDocumento(dto1.getIdPedidoHasProducto());
				tr.setProductoCantidad(dto.getCantidadDes());
				tr.setTransaccion(tran);							
				pedidoService.addTransaccion(tr);
			}
		}
	}
	
	public boolean valForm(PedidoHasProducto dto){
		boolean ban = true;
		if(dto.getCantidadDes() > dto.getCantidad()){
			ban = false;
			
		}else{
			Inventario inv = pedidoService.findInventario(dto.getInventario().getIdInventario());
			System.out.println("existencia " + inv.getExistencia());
			System.out.println("cantidad descargar " + dto.getCantidadDes());
			if(inv.getExistencia() < dto.getCantidadDes()){
				System.out.println("entro a la validacion ");
				ban = false;
			}
		}
		
		return ban;
	}
	
}
